define(function(require, exports){
	var util = require('util')
		,pubjs = require('pubjs')
		,view = require("@base/view")
		,map = require("@base/map/map")
		,tip = require("@base/tip");

	/**
	 * 国家对应的ID
	 * @type {Object}
	 */
	var COUNTRY_ID = pubjs.config("country");

	var Geo = view.container.extend(
		{
			init:function(config){
				config = pubjs.conf(config,
					{
						// 地图国家
						"country":"china"
						// 地图设置
						,"map":{
							// 是否马上绘制
							"atOnce":1
							,"width":480
							,"height":380
							// 地图渲染配置
							// ,"attr":null
							// ,"actAttr":null
							// 地图是否具备事件响应
							,"bindEvent":1
							,"animDelay":300
							// 地图绘制前的操作
							,"beforDraw":null
						}
						// 自动加载数据
						,"autoLoad":1
						// 地图颜色等级
						,"colors":["#FAE1E1", "#ffbebe", "#ff9090", "#fe6464", "#FF2525", "#D60404"]
						,"param":null
						,'reqType': 'ajax'
						,'url':'trend/geo'
					}
				);

				var c = config.get();
				config.set('map/type', c.country);

				// 拼装国家条件
				var param = JSON.parse(c.param.condition);
				param.push({'country_id': COUNTRY_ID[c.country]});
				param = JSON.stringify(param);
				config.set('param/condition', param);

				this.Super('init', arguments);

				// 数据缓存
				this.$data = {};

				// 等级划分
				this.levels = [];

				// 索引
				this.indexMap = {};

				// 加载数据
				if(c.autoLoad){
					this.load();
				}
			}
			/**
			 * 构造地图界面
			 * @return {Undefined} 无返回值
			 */
			,afterBuild:function(){
				var param = util.extend(
					{target: this.$el},
					this.getConfig('map')
				);

				this.create("map", map.base, param);
			}
			,onData:function(err,data){
				if(err){
					pubjs.alert(err.message);
					return false;
				}
				this.setData(data);
			}
			/**
			 * 获取数据
			 * @param {Mix} key 获取数据的索引。可以是字符串，数字，其他类型
			 * @return {Object} 地域数据
			 */
			,getData:function(key){
				var data;
				switch(typeof(key)){
					case "string":
						data = this.$data[this.indexMap[key]];
					break;

					case "number":
						data = this.$data[key];
					break;

					default:
						data = this.$data;
				}
				return data;
			}
			/**
			 * 设定地域数据
			 * @param {Object} data 地域数据
			 */
			,setData:function(data){
				var c = this.getConfig();
				var items = this.$data = data.items || []
					,len = items.length
					,avg = data.amount && ((data.amount.impressions || 0)/len)
					,setp
					,v = 0;
				while(len--){
					items[len].click_rate = util.round0(items[len].click_rate*100, 3) + '%';
					v += Math.pow((items[len].impressions-avg),2);
				}
				v /= (items.length-1);
				setp = Math.round(Math.sqrt(v));
				for(var i =1,l = c.colors.length+1;i<l;i++){
					this.levels.push(setp*i);
				}
				this.coloring();
				len = avg = setp = v = 0;
				this.fire('geoReady');
			}
			/**
			 * 染色
			 * @return {Undefined} 无返回值
			 */
			,coloring:function(){
				var c = this.getConfig();
				var region = this.$.map.$states[c.country]
					,len = this.$data.length
					,items = this.$data
					,path
					,attr;
				for(var i = 0;i<len;i++){
					if(region.hasOwnProperty(items[i].region_name)){
						// 地域对应的数据位置
						this.indexMap[items[i].region_name] = i;
						attr = {
							"fill":this._getColor.call(this,items[i].impressions)
							,"stroke":"#c30"
							,"stroke-width":1
						}
						path = region[items[i].region_name];
						// 重写区域的显示属性
						path.data('attrs',attr);
						path.animate(attr,500);
					}
				}
				attr = path = null;
			}
			/**
			 * 重置模块
			 * @return {Object} 实例本身
			 */
			,reset:function(){
				this.$data = {};
				this.indexMap = {};
				this.$.map.reset();
			}
			/**
			 * 加载数据
			 * @param  {Object}    param 请求参数
			 * @return {Undefined}       无返回值
			 */
			,load:function(param){
				var c = this.getConfig();

				switch(c.reqType){
					case 'ajax':
						pubjs.data.get(c.url, c.param, this);
					break;
					case 'websocket':
						pubjs.mc.send(c.url, c.param, this.onData.bind(this));
					break;
				}
				return;
			}
			,setParam: function(param) {
				var self = this;
				var c = self.getConfig();
				var newParam = util.extend(c.param, param);
				self.setConfig('param', newParam);
				return self;
			}
			,removeSelected:function(){
				this.$.map.removeSelected();
			}
			/**
			 * 颜色等级辨识函数
			 * @param  {Number} n 要检测的数值。该数值会与_Levels数组中的数进行对比
			 * @return {Number}   颜色等级
			 * @private
			 */
			,_getColor:function(n,lvs){
				var c = this.getConfig();
				lvs = lvs || c.colors;
				var len = lvs.length
					,re;
				for(var i = 0;i<len;i++){
					if(n < this.levels[i]){
						re = lvs[i];
						break;
					}
				}
				return re;
			}
		}
	);
	exports.base = Geo;


	// 省份信息提示tip
	var MapTip = tip.base.extend({
		init: function(config){
			config = pubjs.conf(config,{
				'hasArrow': false
			});

			this.Super('init', arguments);
		},
		realHide: function(){
			if (!this.$isShow){
				this.css('display', 'none');
			}

			this.fire('tipHided')
		}
	});
	exports.tip = MapTip;
});